
import java.util.Date;
import java.text.SimpleDateFormat;

class EstagiarioController {

    def springSecurityService
    PessoaService pessoaService;
    VagaService vagaService;
    String controlador;

    /*
     * Se a url vier sem action redireciona para a create.
     */
    def index  = {
        if(!verificaLogon()){
            return;
        }
        Estagiario estagiarioInstance = Estagiario.findById(session.pessoa.id);
        def enderecoInstance          = Endereco.findAllByPessoa(session.pessoa)
        def contatoInstance           = Contato.findAllByPessoa(session.pessoa)
        def vagaInstance              = Vaga.executeQuery("SELECT va FROM Vaga va WHERE va.qtdeVagas > 0 AND va.status = 1 ORDER BY va.dtCadastro DESC LIMIT 5");
        def envioVagaInstance         = EnvioVaga.findByEstagiario(estagiarioInstance);
        
        render(view:"index", model:[estagiarioInstance : estagiarioInstance,
                                    enderecoInstance   : enderecoInstance,
                                    contatoInstance    : contatoInstance,
                                    ultimasVagas       : vagaInstance,
                                    envioVagaList      : envioVagaInstance]);
    };

    /*
     * Closure que lista os estagiários.
     */
    def list   = {
        if(!verificaLogon()){
            return;
        }

        params.max = Math.min(params.max ? params.int('max') : 10, 100);
        def estagiario = Estagiario.createCriteria()
        def results = estagiario.list {
            if (params.nome) {like("nome","%" + params.nome + "%")}
            if (params.id) {eq("id",Long.valueOf(params.id))}
            if (params.cpf) {eq("cpf",params.cpf)}
            
            if (params.max) {maxResults(params.max)}
            if (params.sort) {order(params.sort,params.order)}        
        }  
        
        [estagiarioInstanceList: results, estagiarioInstanceTotal: Estagiario.count()]
    }

    /*
     * Closure que carrega a tela de cadastro.
     */
    def create = {
        // Carrega os atributos e retorna os mesmos.
        def estagiarioInstance = new Estagiario();
        return [estagiarioInstance: estagiarioInstance];
    }


    /*
     * Closure que grava o registro.
     * Seta a session pessoa e envia para a tela de edição do cadastro para que o usuário possa concluir o cadastro.
     */
    def save   = {

        Date hoje = new Date();
        SimpleDateFormat formatador  = new SimpleDateFormat('dd/MM/yyyy hh:MM:ss');



        // Carrega os atributos e recebe os dados
        def estagiarioInstance = new Estagiario(params);
        estagiarioInstance.password = springSecurityService.encodePassword(params.password)
        estagiarioInstance.dtCadastro = Date.parse('dd/MM/yyyy hh:MM:ss',formatador.format(hoje));
        // Grava os dados, seta a sessão pessoa e redireciona para a tela de edição de cadastro.
        if (estagiarioInstance.save(flush: true)) {
            // Seta a RULE do estagiário.
            pessoaService.verificaRole(Pessoa.findById(estagiarioInstance.id), 'gravar');
            session.pessoa = estagiarioInstance;
            redirect(action: "edit", id: estagiarioInstance.id);
        }else {
            render(view:"create",model: [estagiarioInstance: estagiarioInstance]);
        }
    };

    /*
     * Closure que carrega os dados para alteração do registro.
     */
    def edit   = {
        if(!verificaLogon()){
            return;
        }
        int totalEndereco = 0;
        int totalContato = 0;

        // Carrega os dados do Estagiário.
        def estagiarioInstance = Estagiario.findById(session.pessoa.id);
        if (!estagiarioInstance){
            estagiarioInstance   = new Estagiario();
        }
        
        // ENDEREÇOS.
        // Carrega os dados para a alteração do endereço.
        def enderecoDadosInstance = '';
        if(params.endereco != null){
            enderecoDadosInstance = Endereco.findById(params.endereco);
        }else{
            enderecoDadosInstance = new Endereco();
        }
        // Carrega os endereços cadastrados.
        def enderecoInstance   = Endereco.findAllByPessoa(session.pessoa);
        if (enderecoInstance != null){
            totalEndereco = enderecoInstance.count();
        }else{
            enderecoInstance   = new Endereco();
        }

        // CONTATOS.
        // Carrega os dados para a alteração do contato.
        def contatoDadosInstance = '';
        if(params.contato != null){
            contatoDadosInstance = Contato.findById(params.contato);
        }else{
            contatoDadosInstance = new Contato();
        }
        // Carrega os contados cadastrados.
        def contatoInstance = Contato.findAllByPessoa(session.pessoa);
        if (contatoInstance != null){
            totalContato = contatoInstance.count();
        }else{
            contatoInstance    = new Contato();
        }
        //se o estagiário existe retorna os dados
        if (estagiarioInstance){
            render(view:"edit", model: [estagiarioInstance    : estagiarioInstance,
                                        enderecoInstance      : enderecoDadosInstance,
                                        enderecoInstanceList  : enderecoInstance,
                                        enderecoInstanceTotal : totalEndereco,
                                        contatoInstance       : contatoDadosInstance,
                                        contatoInstanceList   : contatoInstance,
                                        contatoInstanceTotal  : totalContato]);
        }else {
            flash.message="Estagiário não encontrado.";
            redirect(action: "create");
        }
    };

    //closure que grava as alterações do registro
    def update   = {
        if(!verificaLogon()){
            return;
        }
        //carrega os atributos de formacao e recebe os dados
        def estagiarioInstance = Estagiario.get(params.id);
        if (estagiarioInstance.password != params.password) {
            params.password = springSecurityService.encodePassword(params.password)
        }
        estagiarioInstance.properties = params;
        //grava as alterações
        if(estagiarioInstance.save()){
            flash.message="Dados alterados com sucesso!";
            redirect(action: "edit");
        }else {
            flash.message="Não foi possível alterar o cadastro!";
            render(view:"edit",model: [estagiarioInstance: estagiarioInstance]);
        }
    };

    //closure responsável pela exibição do cadastro completo
    def show   = {
        if(!verificaLogon()){
            return;
        }
        def pessoaInstance = '';
        if(params.id != null){
            pessoaInstance = Pessoa.get(params.id);
        }else{
            pessoaInstance = Pessoa.get(session.pessoa.id);
        }
        //carrega todas os dados que constituem session.pessoa.ido cadastro de estagiário.
        def estagiarioInstance = Estagiario.get(pessoaInstance.id);
        def enderecoInstance   = Endereco.findAllByPessoa(pessoaInstance);
        def contatoInstance = Contato.findAllByPessoa(pessoaInstance);
        def formacaoInstance = Formacao.findAllByEstagiario(pessoaInstance)
        def estagiarioCursoInstance = EstagiarioCurso.findAllByEstagiario(pessoaInstance)
        def eventoInstance = Evento.findAllByEstagiario(pessoaInstance)
        def idiomaInstance = Idioma.findAllByEstagiario(pessoaInstance)
        def softwareInstance = Software.findAllByEstagiario(pessoaInstance)
        def experienciaInstance = Experiencia.findAllByEstagiario(pessoaInstance)
        //retorna os dados para tela de exibição
        [estagiarioInstance: estagiarioInstance,
         enderecoInstance: enderecoInstance,
         contatoInstance: contatoInstance,
         formacaoInstance: formacaoInstance,
         estagiarioCursoInstance: estagiarioCursoInstance,
         eventoInstance: eventoInstance,
         idiomaInstance: idiomaInstance,
         softwareInstance: softwareInstance,
         experienciaInstance: experienciaInstance];
    };

    //closure que retorna as cidades a partir do estado - NÂO FUNCIONA
    def buscaCidades = {parametro ->
        for(int i=0; i<Cidade.findByid_estado(parametro); i++){
            out.println("<optin value='"+cidades.id[i]+"'>"+cidades.nome[i]+"</optin>");
        }
    }

    /*
     * Closure que exclui o registro
     */
    def delete = {
        if(!verificaLogon()){
            return;
        }
        // carrega os dados
        def estagiarioInstance = Estagiario.findById(params.id)
        // exclui o registro
        if(estagiarioInstance.delete()){
            flash.message = "Estagiário excluído com sucesso.";
            redirect(action: "create");
        }else{
            flash.message = "Não foi possível excluir o estagiário.";
            redirect(action: "create");
        }
    };

    //closure que carrega a página de informações
    def informacoes = {
        render(view:"informacoes");
    }

    //closure que carrega a página de beneficios
    def beneficios = {
        render(view:"beneficios");
    }

    //closure que carrega a página de documentos
    def documentos = {
        render(view:"documentos");
    }


    /*
     * Método que verifica se o usuário está logado.
     * Se não estiver logado é redirecionado para home
     */
    private boolean verificaLogon() {
        if(!session["pessoa"]){
            flash.message = "Você precisa estar logado para acessar esta página.";
            redirect(controller:'login', action:'auth');
            return false;
        }

        return true;
    }
    
}